package com.agent.common.result;

import com.agent.common.entity.PageParam;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;

import java.util.List;

/**
 * 分页结果封装
 */
@Data
public class PageResult<T> {
    private Integer currentPage;
    private Integer pageSize;
    private Long totalItems;
    private Integer totalPages;
    private List<T> items;

    public PageResult(List<T> items, Long totalItems, Integer currentPage, Integer pageSize) {
        this.items = items;
        this.totalItems = totalItems;
        this.currentPage = currentPage;
        this.pageSize = pageSize;
        this.totalPages = calculateTotalPages(totalItems, pageSize);
    }

    /**
     * 从 MyBatis Plus 的 IPage 对象创建分页结果
     * @param page MyBatis Plus 分页对象
     * @param <T> 数据类型
     * @return 分页结果对象
     */
    public static <T> PageResult<T> success(IPage<T> page) {
        return new PageResult<>(
                page.getRecords(),
                page.getTotal(),
                (int) page.getCurrent(),
                (int) page.getSize()
        );
    }

    /**
     * 从列表和分页参数创建分页结果
     * @param items 数据列表
     * @param total 总记录数
     * @param pageParam 分页参数
     * @param <T> 数据类型
     * @return 分页结果对象
     */
    public static <T> PageResult<T> of(List<T> items, Long total, PageParam pageParam) {
        return new PageResult<>(items, total, pageParam.getPage(), pageParam.getSize());
    }

    /**
     * 计算总页数
     * @param totalItems 总记录数
     * @param pageSize 每页大小
     * @return 总页数
     */
    private static int calculateTotalPages(Long totalItems, Integer pageSize) {
        if (pageSize <= 0) return 0;
        return (int) Math.ceil((double) totalItems / pageSize);
    }
}